
(function () {

    var TOKEN_HEADNAME = "Authorization";
    var TOKEN_EXP = "AuthorizationExp";
    var CODE = "code";
    var userinfo = null;
    var ValidTime = 1500; // 25分钟的有效期

    var localAppid = null; // 暂存的appid

    var defaulAppid = 'wx8c6852df92fcfc6b'; // 默认为“矩阵微信活动公众号”

    window.localUserInfo = window.localUserInfo || localStorage.getItem('localUserInfo') // 本地的userinfo


    /**
     * 获取浏览器后缀参数 ?xx=xxx&xxx=xxx
     */
    function GetQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]);
        return null;
    }
    window.GetQueryString = window.GetQueryString || GetQueryString;


    /**
     * ajax请求封装
     * token与userinfo逻辑的封装
     * 
     * @param {*} params // {method,url,data}
     * @param {*} cb 
     */
    function weAjax(params, cb) {
        var xmlhttp = new XMLHttpRequest();

        xmlhttp.onload = function (event) {
            var token = xmlhttp.getResponseHeader(TOKEN_HEADNAME);
            if (token) {
                // 每次请求都要更新token
                localStorage.setItem(TOKEN_HEADNAME, token);
                localStorage.setItem(TOKEN_EXP, parseInt(Date.now() / 1000) + ValidTime);
            }
            var dataJson = JSON.parse(event.target.responseText);
            if (dataJson.code === 0) {
                alert(dataJson.data);
            } else {
                if (cb) cb(dataJson);
            }
        }

        xmlhttp.onerror = xmlhttp.onabort = function (event) {
            alert(event.target.responseText);
        }

        // 默认为post方法
        params.method = params.method || 'get';
        params.method = params.method.toLowerCase();
        params.async = params.async || true;

        if (params.url) {
            xmlhttp.open(params.method, params.url, params.async);
            if (params.method == "post") {
                xmlhttp.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
            }
        } else {
            return console.error('Url Error !')
        }

        xmlhttp.setRequestHeader(TOKEN_HEADNAME, localStorage.getItem(TOKEN_HEADNAME));

        if (params.data) {
            xmlhttp.send(JSON.stringify(params.data));
        } else {
            xmlhttp.send();
        }
    }

    /*
    * 注意：
    * 1. 所有的JS接口只能在公众号绑定的域名下调用，公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
    * 2. 如果发现在 Android 不能分享自定义内容，请到官网下载最新的包覆盖安装，Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
    * 3. 常见问题及完整 JS-SDK 文档地址：http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
    *
    * 开发中遇到问题详见文档“附录5-常见错误及解决办法”解决，如仍未能解决可通过以下渠道反馈：
    * 邮箱地址：weixin-open@qq.com
    * 邮件主题：【微信JS-SDK反馈】具体问题
    * 邮件内容说明：用简明的语言描述问题所在，并交代清楚遇到该问题的场景，可附上截屏图片，微信团队会尽快处理你的反馈。
    */

    /**
     * jsdsdk授权请求
     * @param {*} debug 
     * @param {*} appid 
     */
    function jssdkConfig(debug, appid) {
        weAjax({ url: 'http://api.juzhen.net/jssdk_autho', method: 'post', data: { appid: appid || defaulAppid } }, function (configData) {
            localAppid = localAppid || appid || defaulAppid; // 强制jssdk与用户授权同步
            wx.config({
                debug: debug || false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
                appId: localAppid, // 必填，公众号的唯一标识
                timestamp: configData.timestamp, // 必填，生成签名的时间戳
                nonceStr: configData.noncestr, // 必填，生成签名的随机串
                signature: configData.signature,
                jsApiList: [
                    'checkJsApi',
                    'onMenuShareTimeline',
                    'onMenuShareAppMessage',
                    'onMenuShareQQ',
                    'onMenuShareWeibo',
                    'onMenuShareQZone',
                    'hideMenuItems',
                    'showMenuItems',
                    'hideAllNonBaseMenuItem',
                    'showAllNonBaseMenuItem',
                    'translateVoice',
                    'startRecord',
                    'stopRecord',
                    'onVoiceRecordEnd',
                    'playVoice',
                    'onVoicePlayEnd',
                    'pauseVoice',
                    'stopVoice',
                    'uploadVoice',
                    'downloadVoice',
                    'chooseImage',
                    'previewImage',
                    'uploadImage',
                    'downloadImage',
                    'getNetworkType',
                    'openLocation',
                    'getLocation',
                    'hideOptionMenu',
                    'showOptionMenu',
                    'closeWindow',
                    'scanQRCode',
                    'chooseWXPay',
                    'openProductSpecificView',
                    'addCard',
                    'chooseCard',
                    'openCard'
                ]
            });
        })
    }

    /**
     * 用户授权
     * 
     */
    function userAutho(appid, authoUrl, cb) {
        localAppid = localAppid || appid || defaulAppid; // 强制jssdk与用户授权同步

        var exp = parseInt(localStorage.getItem(TOKEN_EXP));
        if (exp && exp > parseInt(Date.now() / 1000)) {
            weAjax(
                {
                    method: 'post',
                    url: 'http://api.juzhen.net/fresh_token'
                },
                function (data) {
                    console.log(data.data);
                    localStorage.setItem(TOKEN_EXP, parseInt(Date.now() / 1000) + ValidTime); // 延续性
                    cb();
                });

            return;
        }

        if (!GetQueryString('code')) {
            window.location.href = authoUrl;
            return false;
        }

        weAjax(
            {
                method: 'post',
                url: 'http://api.juzhen.net/wx_autho',
                data: { code: GetQueryString('code'), appid: localAppid }
            },
            function (data) {
                if (data.code) {
                    localUserInfo = data.userInfo;
                    localStorage.setItem('localUserInfo', JSON.stringify(localUserInfo));
                    console.log('欢迎您 :' + localUserInfo.nickname);
                    cb();
                } else {
                    window.location.href = authoUrl;
                }
            });

    }

    window.weAjax = window.weAjax || weAjax;
    window.jssdkConfig = window.jssdkConfig || jssdkConfig;
    window.userAutho = window.userAutho || userAutho;
}())
